home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 1996 June / Software of the Month Club 1996 June.iso / pc / dos / dtp / display / drvsrc / et3000.asm < prev    next >
Assembly Source File  |  1992-12-07  |  11KB  |  361 lines

  1. ;--------------------------------------------------------------------------
  2. ; This is file ET3000.ASM
  3. ;
  4. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  5. ; Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
  6. ;
  7. ; This file is distributed under the terms listed in the document
  8. ; "copying.dj", available from DJ Delorie at the address above.
  9. ; A copy of "copying.dj" should accompany this file; if not, a copy
  10. ; should be available from where this file was obtained.  This file
  11. ; may not be distributed without a verbatim copy of "copying.dj".
  12. ;
  13. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  14. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. ;--------------------------------------------------------------------------
  16.  
  17. include grdriver.inc
  18. cseg    segment byte public 'code'
  19.     assume  cs:cseg, ds:cseg, es:cseg, ss:nothing
  20.  
  21.  
  22. ;--------------------------------------------------------------------------
  23. ; DRIVER HEADER
  24. ;  The following entries MUST match the structure and constant
  25. ;  declarations in the file 'grdriver.h' of the GRX graphics library
  26. ;  The mode word should contain the following bitfields:
  27. ;     - the GRD_NEW_DRIVER bit set for any new format driver
  28. ;     - the adapter type field should be specified
  29. ;     - the memory size field should be specified
  30. ;     - the paging mode field should be specified
  31. ;  The mode set routine will OR in the plane bitfield as it will
  32. ;  change when different color number modes are requested.
  33. ;--------------------------------------------------------------------------
  34.  
  35.     dw    offset mode_set_routine
  36.     dw    offset paging_routine
  37. mode_W  dw    GRD_NEW_DRIVER+GRD_VGA+GRD_512K+GRD_NO_RW
  38. ;
  39. ; The 'def_xx' fields are filled in by go32 from the corresponding
  40. ; fields of the 'GO32' environment variable
  41. ;
  42. def_tw  dw    80        ; text width
  43. def_th  dw    25          ; text height
  44. def_gw  dw    640        ; graphics width
  45. def_gh  dw    480        ; graphics height
  46. def_nc  dw    16        ; graphics colors
  47.     dw    offset driver_init_routine
  48.     dw    offset text_mode_table
  49.     dw    offset graphics_mode_table
  50.  
  51. ;
  52. ; Biggest text and graphics sizes
  53. ;
  54. Max_TW  equ    132
  55. Max_TH  equ    44
  56. Max_GWn equ    800        ; non interlaced!!!
  57. Max_GHn equ    600
  58. Max_GW  equ    1024        ; may be interlaced
  59. Max_GH  equ    768
  60.  
  61.  
  62. ;--------------------------------------------------------------------------
  63. ; TABLE OF SUPPORTED TEXT MODES
  64. ;    - keep sorted by size
  65. ;    - end with an all 0 entry
  66. ;    - BIOS field = 0xff disables it
  67. ;    - fields:
  68. ;        width,  height, colors, BIOS#+  setup_procedure_index*256
  69. ;--------------------------------------------------------------------------
  70. text_mode_table            label word
  71.     dw    80,     25,    2,    007h +  00000h
  72.     dw    40,     25,    16,    001h +  00000h
  73.     dw    80,     25,    16,    003h +  00000h
  74.     dw    80,     60,    16,    025h +  00000h
  75.         dw      80,     65,     16,     026h +  00000h
  76.     dw    132,    25,    16,    023h +  00000h
  77.     dw    132,    28,    16,    024h +  00000h
  78.     dw    132,    44,    16,    022h +  00000h
  79.     dw    0,      0,    0,    000h +  00000h
  80.  
  81.  
  82. ;--------------------------------------------------------------------------
  83. ; TABLE OF SUPPORTED GRAPHICS MODES
  84. ;    - keep sorted first by colors then by size
  85. ;    - end with an all 0 entry
  86. ;    - BIOS field = 0xff disables it
  87. ;    - fields:
  88. ;         width,  height, colors, BIOS#+  setup_procedure_index*256
  89. ;--------------------------------------------------------------------------
  90. graphics_mode_table     label word
  91.     dw    320,    200,    16,    00dh +  00000h
  92.     dw    640,    200,    16,    00eh +  00000h
  93.     dw    640,    350,    16,    010h +  00000h
  94.     dw    640,    480,    16,    012h +  00000h
  95.     dw    800,    600,    16,    029h +  00000h
  96.     dw    1024,    768,    16,    037h +  00000h
  97.     dw    320,    200,    256,    013h +  00000h
  98.     dw    640,    350,    256,    02dh +  00000h
  99.     dw    640,    480,    256,    02eh +  00000h
  100.     dw    800,    600,    256,    030h +  00000h
  101.     dw    0,      0,     0,    000h +  00000h
  102.  
  103.  
  104. ;--------------------------------------------------------------------------
  105. ; TABLE OF SPECIAL SETUP PROCEDURES
  106. ;  You may need such procedures for:
  107. ;     -- reloading fonts on standard EGA or VGA for
  108. ;     higher resolution text modes
  109. ;     -- enable HiColor mode of some Super VGAs
  110. ;     -- Handle the parameter passing conventions of the VESA BIOS
  111. ;     -- put VGA into 256 color plane mode ("MODE X")
  112. ;     -- etc...
  113. ;  There should be one entry in the table for every non-zero
  114. ;  'setup_procedure_index' in the text and graphics mode tables.
  115. ;  The first entry in the table belongs to index 100h, and so on.
  116. ;  The special setup procedure is invoked via a near call.
  117. ;
  118. ;  Entry: DI=address of the mode record from the text or graphics
  119. ;      table to set up.
  120. ;
  121. ;  Exit:  Adapter configured
  122. ;      BX=driver mode word as it should be returned by the mode set
  123. ;         routine. Typically it involves picking up the mode word
  124. ;         from the header and OR-ing in the appropriate bitplane mode
  125. ;         bitfield. (This is not needed for text modes)
  126. ;      AX, CX, DX, SI can be trashed, PRESERVE DI!!!!
  127. ;
  128. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  129. ;--------------------------------------------------------------------------
  130. special_setup_table    label word
  131.     dw    0    ; none here !!
  132.  
  133.  
  134. ;--------------------------------------------------------------------------
  135. ; DRIVER INIT ROUTINE
  136. ;  called once after the driver is loaded
  137. ;  may do one or more of the followings:
  138. ;    - check for proper board type
  139. ;    - check amount of RAM on board, and:
  140. ;    -- update word in header to reflect correct amount
  141. ;    -- disable modes in the tables for which there is not enough RAM
  142. ;    - check for special equipment (HiColor DAC, etc...)
  143. ;
  144. ;  Entry: nothing
  145. ;
  146. ;  Exit:  AX=status:
  147. ;       non-zero: OK,
  148. ;       0: something went wrong (e.g. wrong adapter, etc..)
  149. ;      BX,CX,DX may be trashed
  150. ;
  151. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  152. ;--------------------------------------------------------------------------
  153. driver_init_routine    proc    far
  154.     mov    ax,1
  155.     ret
  156. driver_init_routine    endp
  157.  
  158.  
  159. ;--------------------------------------------------------------------------
  160. ; MODE SET ROUTINE
  161. ;  sets up a text or graphics mode as close as possible to the one
  162. ;  reguested by the user with regard to number of colors and size.
  163. ;
  164. ;  Entry: AX=mode selection
  165. ;     0 = 80x25 text
  166. ;     1 = default text
  167. ;     2 = text CX cols by DX rows
  168. ;     3 = biggest text
  169. ;     4 = 320x200 graphics
  170. ;     5 = default graphics
  171. ;     6 = graphics CX width by DX height
  172. ;     7 = biggest non-interlaced graphics
  173. ;     8 = biggest graphics
  174. ;     9 = graphics BX colors, CX width by DX height
  175. ;
  176. ;  Exit: BX=driver mode flag
  177. ;     CX=width (in pixels or characters)
  178. ;     DX=height
  179. ;
  180. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  181. ;     YOU SHOULD NOT NEED TO CHANGE THIS ROUTINE AS IT IS PRETTY
  182. ;     MUCH TABLE DRIVEN
  183. ;--------------------------------------------------------------------------
  184. mode_set_routine    proc    far
  185.     push    ds
  186.     push    di
  187.     push    si
  188.     mov    si,cs
  189.     mov    ds,si
  190.     cmp    ax,9
  191.     jbe    DoIt
  192.     jmp    Exit
  193. DoIt:    add    ax,ax
  194.     mov    si,ax
  195.     jmp    WORD PTR mode_set_table[si]
  196. mode_set_table  label    word
  197.     dw    offset mode_0
  198.     dw    offset mode_1
  199.     dw    offset mode_2
  200.     dw    offset mode_3
  201.     dw    offset mode_4
  202.     dw    offset mode_5
  203.     dw    offset mode_6
  204.     dw    offset mode_7
  205.     dw    offset mode_8
  206.     dw    offset mode_9
  207. mode_0: mov    si,offset text_mode_table    ; 80x25 text
  208.     mov    bx,def_nc
  209.     mov    cx,80
  210.     mov    dx,25
  211.     jmp    Lookup
  212. mode_1: mov    si,offset text_mode_table    ; default text
  213.     mov    bx,def_nc
  214.     mov    cx,def_tw
  215.     mov    dx,def_th
  216.     jmp    Lookup
  217. mode_2: mov    si,offset text_mode_table    ; CX*DX text
  218.     mov    bx,def_nc
  219.     jmp    Lookup
  220. mode_3: mov    si,offset text_mode_table    ; biggest text
  221.     mov    bx,def_nc
  222.     mov    cx,Max_TW
  223.     mov    dx,Max_TH
  224.     jmp    Lookup
  225. mode_4: mov    si,offset graphics_mode_table    ; 320x200 graphics
  226.     mov    bx,def_nc
  227.     mov    cx,320
  228.     mov    dx,200
  229.     jmp    Lookup
  230. mode_5: mov    si,offset graphics_mode_table    ; default graphics
  231.     mov    bx,def_nc
  232.     mov    cx,def_gw
  233.     mov    dx,def_gh
  234.     jmp    Lookup
  235. mode_6: mov    si,offset graphics_mode_table    ; CX*DX graphics
  236.     mov    bx,def_nc
  237.     jmp    Lookup
  238. mode_7: mov    si,offset graphics_mode_table    ; biggest non-interlaced gr
  239.     mov    bx,def_nc
  240.     mov    cx,Max_GWn
  241.     mov    dx,Max_GHn
  242.     jmp    Lookup
  243. mode_8: mov    si,offset graphics_mode_table    ; biggest graphics
  244.     mov    bx,def_nc
  245.     mov    cx,Max_GW
  246.     mov    dx,Max_GH
  247.     jmp    Lookup
  248. mode_9: mov    si,offset graphics_mode_table    ; CX*DX graphics w/ BX colors
  249. ;
  250. ; At this point:
  251. ;   SI points to the table to search (text or graphics)
  252. ;   BX has colors
  253. ;   CX has width
  254. ;   DX has height
  255. ;
  256. Lookup: xor    ax,ax                   ; last color number seen
  257. Find_C: cmp    [si+4],ax              ; last color number == this?
  258.     je    Same_C
  259.     jb    Prev_C                   ; end of table -- use last color
  260.     cmp    BYTE PTR [si+6],0ffh        ; valid entry ?
  261.     je    Prev_C                   ; not -- use last color
  262.     mov    ax,[si+4]              ; record color number
  263.     mov    di,si                   ; start of entries w/ this color
  264.     cmp    ax,bx                   ; enough colors ?
  265.     jae    Find_S
  266. Same_C: add    si,8
  267.     jmp    Find_C
  268. Prev_C: or    ax,ax                   ; found any color at all?
  269.     je    Exit
  270. ;
  271. ; At this point:
  272. ;   DI points into the table to the first entry with the desired color
  273. ;      number (either it has enough colors or it is the highest color
  274. ;      number supported by the driver). Additionally, at least the
  275. ;      first (= smallest size) entry for this color is valid (has a
  276. ;      valid BIOS number).
  277. ;   AX has the color number adjusted for the driver
  278. ;   CX has width
  279. ;   DX has height
  280. ;
  281. Find_S: cmp    [di+4],ax            ; still the same color #?
  282.     jne    Prev_S
  283.     cmp    BYTE PTR [di+6],0ffh        ; valid entry ?
  284.     je    Prev_S
  285.     cmp    [di],cx
  286.     jb    Next_S
  287.     cmp    [di+2],dx
  288.     jae    GotIt
  289. Next_S: add    di,8
  290.     jmp    Find_S
  291. Prev_S: sub    di,8
  292. ;
  293. ; At this point:
  294. ;   DI points to the table entry we want to set up
  295. ;
  296. GotIt:  mov    ax,[di+6]            ; BIOS mode number
  297.     or    ah,ah                ; special ?
  298.     je    doBIOS
  299.     mov    al,ah
  300.     xor    ah,ah
  301.     dec    ax
  302.     add    ax,ax
  303.     mov    si,ax
  304.     call    WORD PTR special_setup_table[si]
  305.     jmp    RetVal
  306. doBIOS: int    10h
  307.     mov    bx,GRD_1_PLANE
  308.     cmp    WORD PTR [di+4],2        ; 2 colors ?
  309.     je    doFLAG
  310.     mov    bx,GRD_4_PLANES
  311.     cmp    WORD PTR [di+4],16        ; 16 colors ?
  312.     je    doFLAG
  313.     mov    bx,GRD_8_PLANES
  314.     cmp    WORD PTR [di+4],256        ; 256 colors ?
  315.     je    doFLAG
  316.     mov    bx,GRD_16_PLANES
  317.     cmp    WORD PTR [di+4],32768        ; 32K colors ?
  318.     je    doFLAG
  319.     mov    bx,GRD_PLANE_MASK        ; something is wrong!!
  320. doFLAG: or    bx,mode_W
  321. RetVal: mov    cx,[di]
  322.     mov    dx,[di+2]
  323. Exit:    pop    si
  324.     pop    di
  325.     pop    ds
  326.     ret
  327. mode_set_routine    endp
  328.  
  329.  
  330. ;--------------------------------------------------------------------------
  331. ; PAGING ROUTINE
  332. ;
  333. ;  Entry: AH=read page
  334. ;      AL=write page
  335. ;
  336. ;  Exit: VGA configured.
  337. ;     AX,BX,CX,DX,SI,DI may be trashed
  338. ;
  339. ;  NOTE: This runs in protected mode!  Don't mess with the segment registers!
  340. ;     This code must be relocatable and may not reference any data!
  341. ;--------------------------------------------------------------------------
  342.      assume  ds:nothing, es:nothing
  343.  
  344. paging_routine  proc    far
  345.     and    al,07h
  346.     and    ah,07h
  347.     shl    ah,1
  348.     shl    ah,1
  349.     shl    ah,1
  350.     or    al,ah
  351.     or    al,40h
  352.     mov    dx,03cdh
  353.     out    dx,al
  354.     ret
  355. paging_routine  endp
  356.  
  357.  
  358. cseg    ends
  359.      end
  360.  
  361.